In informatica, la semantica denotazionale è un approccio per formalizzare il significato dei linguaggi di programmazione, costruendo oggetti matematici (chiamati denotazioni) i quali descrivono i significati delle espressioni del linguaggio. Altri approcci tesi a fornire una semantica formale dei linguaggi di programmazione includono la semantica assiomatica e la semantica operazionale.
La semantica denotazionale ebbe origine negli anni sessanta, grazie al lavoro di Christopher Strachey e Dana Scott. Negli sviluppi originali di Strachey e Scott la semantica denotazionale fornisce la denotazione (significato) di un programma come una funzione che associa l'input all'output[1]. Per dare una denotazione dei programmi definiti ricorsivamente, Scott propose di lavorare con funzioni continue tra domini, in particolare tra ordinamenti parziali completi. I lavori di ricerca continuano tuttora, studiando un'appropriata semantica denotazionale per aspetti dei linguaggi di programmazione quali la sequenzialità, la concorrenza ed il non determinismo.
In linea di massima, la semantica denotazionale si occupa di trovare oggetti matematici che rappresentino cosa fanno i programmi. Insiemi di tali oggetti vengono chiamati domini. Ad esempio i programmi (o parti di programmi) possono essere rappresentati da funzioni parziali.
Un elemento importante della semantica denotazionale è che "la semantica dovrebbe essere composizionale": la denotazione di un'istruzione in un programma dovrebbe essere costruita a partire dalle denotazioni delle sue sotto-istruzioni. Un semplice esempio: il significato di "3 + 4" è determinato dai significati di "3", "4" e "+".
La semantica denotazionale fu sviluppata inizialmente come framework per i programmi funzionali e sequenziali, come funzioni matematiche che associano l'input all'output.